{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# CPSC 330 Lecture 1\n",
    "\n",
    "Instructor: Mike Gelbart"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Outline:\n",
    "\n",
    "- Using Zoom (5 min)\n",
    "- About this course (20 min)\n",
    "- Python requirements/resources (10 min)\n",
    "- Survey + Break (10 min)\n",
    "- Introducing our first dataset (5 min)\n",
    "- Introduction to supervised learning (10 min)\n",
    "- `DummyClassifier` (5 min)\n",
    "- Activity (15 min)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "from sklearn.dummy import DummyClassifier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Scholar Strike Canada\n",
    "\n",
    "- As you may know, [Scholar Strike Canada](https://scholarstrikecanada.ca/) is happening yesterday & today with support from UBC.\n",
    "- I have decided to keep class on as planned because the whole term is already mapped out.\n",
    "- If you would like to participate in the strike, you can watch the recording of this lecture later."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Wave hello and start recording\n",
    "\n",
    "- See title"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Using Zoom while someone is screensharing (10 min)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- When someone is screensharing, Zoom automatically puts you into full screen.\n",
    "- This is annoying most of the time, and I suggest you disable this in settings.\n",
    "- However, for this course you can go into full screen because I will explicity leave you space on the right side. \n",
    "- Please mark \"yes\" in the Participants box to confirm that you have the set up done correctly.\n",
    "- If you're working on a smaller monitor, feel free to close the participants box most of the time (or put it underneath the chat)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## About this course (20 min)\n",
    "\n",
    "#### Most important link\n",
    "\n",
    "https://github.com/UBC-CS/cpsc330\n",
    "\n",
    "Please read everything on there!\n",
    "\n",
    "**Syllabus quiz** available on Canvas, **due Friday at 11:59pm.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### CPSC 330 vs. 340\n",
    "\n",
    "https://github.com/UBC-CS/cpsc330/blob/master/docs/330_vs_340.md\n",
    "\n",
    "TLDR:\n",
    "\n",
    "- CPSC 340 has many prerequisites. \n",
    "- CPSC 340 goes deeper but has a more narrow scope.\n",
    "- I think CPSC 330 will be more useful if you just plan to apply basic ML.\n",
    "\n",
    "Summary:\n",
    "\n",
    "- 340: how do ML models work?\n",
    "- 330: how do I use ML models?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Registration, waitlist and prerequisites\n",
    "\n",
    "https://github.com/UBC-CS/cpsc330/blob/master/docs/course_info.md#registration\n",
    "\n",
    "Please do not contact me about these issues before reading everything in this document. Even then, I am very unlikely to be able to help with registration, waitlist or prerequisite issues.\n",
    "\n",
    "- This year, specifically:\n",
    "  - A couple weeks ago we let everyone in off the waitlist.\n",
    "  - If you joined the waitlist since then, your chances are not great.\n",
    "  - Also, you will not be able to complete the syllabus quiz or submit the homeworks to Canvas.\n",
    "  - If you'd like to try your chances, you can still do the homework and just push your work to GitHub."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Course format\n",
    "\n",
    "- Lectures T/Th at 11am, \"watch parties\" the same days at 8pm. Both are optional - recordings will be posted.\n",
    "- Optimistic plan: weekly assignments due Mondays at 11:59pm (except the first assignment).\n",
    "- First assignment due **this coming Tuesday**, Sep 15th, at 11:59pm (you should have hw repos already), see https://github.students.cs.ubc.ca/cpsc330-2020w-t1.\n",
    "- You must do the first assignment on your own.\n",
    "- I'm hoping you'll be able to work in partners on subsequent assignments - pending the technology side of things.\n",
    "- Weekly tutorials will be **office hour format** run by the TAs and are **completely optional**.\n",
    "  - You do not need to be registered in a tutorial.\n",
    "  - You can attend whatever tutorials or office hours your want, regardless of in which/whether you're registered.\n",
    "- One midterm, one final.\n",
    "  - I'm thinking of a \"take-home\" format but \"real time\" is not off the table yet."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Course calendar\n",
    "\n",
    "https://htmlpreview.github.io/?https://github.com/UBC-CS/cpsc330/blob/master/docs/calendar.html"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Course structure\n",
    "\n",
    "- First half: supervised learning on tabular data (the fundamentals)\n",
    "  - We'll look at a different dataset each week for the first 5-6 weeks\n",
    "- Second half: commmon special cases\n",
    "  - We'll dig into common scenarios that deviate from the standard paradigm of supervised learning on tabular data. \n",
    "- The last few classes: communication and ethics\n",
    "  - These skills are not beneficial if you can't use them responsibly and communicate your results."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Code of conduct\n",
    "\n",
    "- Our main forum for getting help will be [Piazza](https://piazza.com/class/kb2e6nwu3uj23).\n",
    "- Please read the entire [document about asking for help](https://github.com/UBC-CS/cpsc330/blob/master/docs/asking_for_help.md).\n",
    "\n",
    "TLDR: be nice.\n",
    "\n",
    "#### Grades\n",
    "\n",
    "- The grading breakdown is [here](https://github.com/UBC-CS/cpsc330/blob/master/docs/course_info.md#grading). \n",
    "- The policy on challenging grades is [here](https://github.com/UBC-CS/cpsc330/blob/master/docs/grades.md).\n",
    "  - I know I get a little grumpy around this issue (sorry)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Course technology stack: Python, git, GitHub\n",
    "\n",
    "- Instructions on course page for Python and [git](https://github.com/UBC-CS/cpsc330/blob/master/docs/git_installation.md).\n",
    "- Once you have these installed, you will need to set up your local Python environment following the instructions [here](https://github.com/UBC-CS/cpsc330/blob/master/docs/setup.md).\n",
    "  - If you run into trouble, post on Piazza and one of the TAs will help you (or attend office hours where you can share your screen)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Lecture and homework format: Jupyter notebooks\n",
    "\n",
    "- This document is a [Jupyter notebook](https://jupyter.org/), with file extension `.ipynb`.\n",
    "- Confusingly, \"Jupyter notebook\" is also the original application that opens `.ipynb` files - but has since been replaced by **Jupyter lab**.\n",
    "  - I am using Jupyter lab, some things might not work with the Jupyter notebook application.\n",
    "  - The course setup/install instructions include Jupyter lab.\n",
    "- Jupyter notebooks contain a mix of code, code output, markdown-formatted text (including LaTeX equations), and more.\n",
    "  - When you open a Jupyter notebook in one of these apps, the document is \"live\", meaning you can run the code.\n",
    "  - For example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1+1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[9999, 2, 3]"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = [1,2,3]\n",
    "x[0] = 9999\n",
    "x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- By default, Jupyter prints out the result of the last line of code, so you don't need as many `print` statements.\n",
    "- In addition to the \"live\" notebooks, Jupyter notebooks can be statically rendered in the web browser, e.g. [this](https://github.com/UBC-CS/cpsc330/blob/master/lectures/01_intro.ipynb).\n",
    "  - This can be convenient for quick read-only access, without needing to launch the Jupyter notebook/lab application.\n",
    "  - But you need to launch the app properly to interact with the notebooks.\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Lecture style\n",
    "\n",
    "- Lots of live coding in Jupyter.\n",
    "- All materials will be posted."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Lecture notes\n",
    "\n",
    "- All the lectures from last year are already available on the course website.\n",
    "- I cannot promise anything will stay the same from last year to this year, so read them in advance at your own risk.\n",
    "- A \"finalized\" version will be pushed to GitHub right before each class."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### About me\n",
    "\n",
    "- PhD in machine learning, have been teaching at UBC since then (no more research).\n",
    "- I do some consulting for startups and for a venture capital fund.\n",
    "- Part of the team that created the UBC Master of Data Science (MDS), Co-Director of MDS since 2018.\n",
    "- Have taught CPSC 340 several times.\n",
    "- Designed this course, this is my second time teaching it.\n",
    "- Please call me Mike!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Surveys (5 min)\n",
    "\n",
    "- Please complete the anonymous entry survey on Qualtrics [here](https://ubc.ca1.qualtrics.com/jfe/form/SV_6RI7xxxTSlWqeXP).\n",
    "- Also, please complete the anonymous cilantro survey on Qualtrics [here](https://ubc.ca1.qualtrics.com/jfe/form/SV_43egGadpsmKxUuV).\n",
    "  - We wil be analyzing these data set next week in class!!\n",
    "- Click \"Yes\" in the participants box when you are done both surveys."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Break (5 min)\n",
    "\n",
    "- We will try to take a 5-minute break half way through every class."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Python requirements/resources (10 min)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Python knowledge you'll need\n",
    "\n",
    "- Basic Python programming\n",
    "- Numpy\n",
    "- Pandas\n",
    "- Matplotlib\n",
    "- Sparse matrices\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Python resources\n",
    "\n",
    "- We do not have time to teach all the Python we need.\n",
    "- Some of you will already know Python, others won't.\n",
    "- Homework 1 is all about Python.\n",
    "\n",
    "https://github.com/UBC-CS/cpsc330/blob/master/docs/resources.md"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Introducing our first data set (5 min)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- This dataset contains longtitude and latitude data for 400 cities in the US\n",
    "- Each city is labelled as `red` or `blue` depending on how they voted in the 2012 election.\n",
    "- The cities data was sampled from [here](http://simplemaps.com/static/demos/resources/us-cities/cities.csv). The election information was collected from Wikipedia."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This dataset contains votes (red or blue) for various cities (?) in some past U.S. election."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>lon</th>\n",
       "      <th>lat</th>\n",
       "      <th>vote</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-80.162475</td>\n",
       "      <td>25.692104</td>\n",
       "      <td>blue</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-80.214360</td>\n",
       "      <td>25.944083</td>\n",
       "      <td>blue</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-80.094133</td>\n",
       "      <td>26.234314</td>\n",
       "      <td>blue</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-80.248086</td>\n",
       "      <td>26.291902</td>\n",
       "      <td>blue</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>-81.789963</td>\n",
       "      <td>26.348035</td>\n",
       "      <td>blue</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>396</th>\n",
       "      <td>-97.460476</td>\n",
       "      <td>48.225094</td>\n",
       "      <td>red</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>397</th>\n",
       "      <td>-96.551116</td>\n",
       "      <td>48.591592</td>\n",
       "      <td>blue</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>398</th>\n",
       "      <td>-166.519855</td>\n",
       "      <td>53.887114</td>\n",
       "      <td>red</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>399</th>\n",
       "      <td>-163.733617</td>\n",
       "      <td>67.665859</td>\n",
       "      <td>red</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>400</th>\n",
       "      <td>-145.423115</td>\n",
       "      <td>68.077395</td>\n",
       "      <td>red</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>400 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "            lon        lat  vote\n",
       "1    -80.162475  25.692104  blue\n",
       "2    -80.214360  25.944083  blue\n",
       "3    -80.094133  26.234314  blue\n",
       "4    -80.248086  26.291902  blue\n",
       "5    -81.789963  26.348035  blue\n",
       "..          ...        ...   ...\n",
       "396  -97.460476  48.225094   red\n",
       "397  -96.551116  48.591592  blue\n",
       "398 -166.519855  53.887114   red\n",
       "399 -163.733617  67.665859   red\n",
       "400 -145.423115  68.077395   red\n",
       "\n",
       "[400 rows x 3 columns]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv('data/cities_USA.csv', index_col=0)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df.plot.scatter(x=\"lon\", y=\"lat\", c=\"vote\", alpha=0.3);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Introduction to supervised learning (10 min)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- In supervised learning, we have a set of features, $X$, with associated targets, $y$\n",
    "- We wish to find a model function that relates $X$ to $y$\n",
    "- Then use that model function to predict $y$ for new values of $X$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "What are $X$ and $y$ here?\n",
    "\n",
    "<br><br><br>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>lon</th>\n",
       "      <th>lat</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-80.162475</td>\n",
       "      <td>25.692104</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-80.214360</td>\n",
       "      <td>25.944083</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-80.094133</td>\n",
       "      <td>26.234314</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-80.248086</td>\n",
       "      <td>26.291902</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>-81.789963</td>\n",
       "      <td>26.348035</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>396</th>\n",
       "      <td>-97.460476</td>\n",
       "      <td>48.225094</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>397</th>\n",
       "      <td>-96.551116</td>\n",
       "      <td>48.591592</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>398</th>\n",
       "      <td>-166.519855</td>\n",
       "      <td>53.887114</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>399</th>\n",
       "      <td>-163.733617</td>\n",
       "      <td>67.665859</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>400</th>\n",
       "      <td>-145.423115</td>\n",
       "      <td>68.077395</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>400 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "            lon        lat\n",
       "1    -80.162475  25.692104\n",
       "2    -80.214360  25.944083\n",
       "3    -80.094133  26.234314\n",
       "4    -80.248086  26.291902\n",
       "5    -81.789963  26.348035\n",
       "..          ...        ...\n",
       "396  -97.460476  48.225094\n",
       "397  -96.551116  48.591592\n",
       "398 -166.519855  53.887114\n",
       "399 -163.733617  67.665859\n",
       "400 -145.423115  68.077395\n",
       "\n",
       "[400 rows x 2 columns]"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = df[[\"lon\", \"lat\"]]\n",
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1      blue\n",
       "2      blue\n",
       "3      blue\n",
       "4      blue\n",
       "5      blue\n",
       "       ... \n",
       "396     red\n",
       "397    blue\n",
       "398     red\n",
       "399     red\n",
       "400     red\n",
       "Name: vote, Length: 400, dtype: object"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y = df[\"vote\"]\n",
    "y"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Note that $X$ is a 2-dimensional array, whereas $y$ is 1-dimensional."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(400, 2)"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.ndim"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(400,)"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.ndim"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Classification vs Regression\n",
    "- Variables can be characterized as quantitative/numeric or qualitative/categorical\n",
    "- **Classification** = prediction of a categorical target (e.g. red vs. blue)\n",
    "- **Regression** = prediction of a quantitative target (coming later in this course)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src='img/regr.png' width=\"750\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There is also _unsupervised learning_, which we'll talk about (very briefly) later in the course."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- For ML we typically work with \"tabular data\".\n",
    "- Rows are examples.\n",
    "- Columns are features (the last column is typically the target)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Terminology\n",
    "- You will see a lot of variable terminology in machine learning and statistics\n",
    "- See the MDS terminology resource [here](https://ubc-mds.github.io/resources_pages/terminology/).\n",
    "\n",
    "Of particular note:\n",
    "\n",
    "- **examples** = rows = samples = records = instances\n",
    "- **features** = inputs = predictors = explanatory variables = regressors = independent variables = covariates\n",
    "- **targets** = outputs = outcomes = response variable = dependent variable = labels (if categorical).\n",
    "- **training** = learning = fitting"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## `DummyClassifier` (5 min)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- For most things in the course, we will be using an open-source Python library called [scikit-learn](https://scikit-learn.org/).\n",
    "- scikit-learn has a standard paradigm with `fit` and `predict` that we'll be using a lot.\n",
    "- Today we'll start with the simplest classifier, [`DummyClassifier`](https://scikit-learn.org/stable/modules/generated/sklearn.dummy.DummyClassifier.html).\n",
    "- In this course we'll start every classification problem with `DummyClassifier` as a baseline."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.dummy import DummyClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "dc = DummyClassifier(strategy=\"prior\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "sklearn.dummy.DummyClassifier"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(dc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "dc.fit(X, y);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['blue'], dtype='<U4')"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dc.predict([[0, 0]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.585"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dc.score(X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- What is this doing?\n",
    "- Just picking the most popular class:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "blue    234\n",
       "red     166\n",
       "Name: vote, dtype: int64"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "y.value_counts()/len(y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Blue is more common, so just predict blue everywhere:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue',\n",
       "       'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue'],\n",
       "      dtype='<U4')"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dc.predict(X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "From xkcd:\n",
    "\n",
    "![](https://imgs.xkcd.com/comics/is_it_christmas.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## True/False questions (15 min)\n",
    "\n",
    "1. `DummyClassifier` will always get $\\geq 50$% prediction accuracy.\n",
    "2. `DummyClassifier` ignores the features when predicting.\n",
    "3. `DummyClassifier` is a special case where `fit` doesn't do anything.\n",
    "4. Any reasonable classifier should achieve a higher prediction accuracy than `DummyClassifier`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
